class RestServicioController < ApplicationController
  # Estas son las librerias necesariaas
  require 'uri'
  require 'net/http'
  require 'open-uri'
  require 'xmlsimple'

  def apoyo  # revisar si el cliente ya existe para no crearlo de nuevo y verificar los datos.

    xml = params[:solicitud]

    if (OrdenServicio.validar_xml_remoto(xml))
      cliente = xml[:cliente]
      orden = xml[:orden]
      paquetes = xml[:paquetes]
      

      @cliente = Cliente.find(:first, :conditions => [" correo = ?", cliente[:correo] ])
      @tarjeta = Tarjeta.find(:first, :conditions => ["numero_cuenta = ?", cliente[:tarjeta]])
      @direccion = Direccion.find(:first, :conditions => ["nombre = ?",  cliente[:nombre_direccion]])
      @compania = Compania.find(:first)
      
      if @tarjeta and @direccion and @direccion.cliente_id == @cliente.id and @tarjeta.cliente_id == @cliente.id


        @tarjeta.cliente_id = @cliente.id
        @tarjeta.save

        @direccion.cliente_id = @cliente.id
        @direccion.save


        @orden_servicio = OrdenServicio.new(orden)
        @orden_servicio.cliente_id = @cliente.id
        @orden_servicio.direccion_id = @direccion.id
        @orden_servicio.compania_id = @compania.id
        @orden_servicio.fecha_orden = Time.now.strftime("%d-%m-%Y")
        @orden_servicio.estatus = "Pendiente por Recolectar"
        @orden_servicio.traking = ("305" + rand(9999999999999999999).to_s).to_i
        @orden_servicio.save


        @paquete = Paquete.new(paquetes[:paquete])
        @paquete.orden_servicio_id = @orden_servicio.id
        @paquete.tipo = "Paquete tipo " + rand(99).to_s
        @paquete.save
        $totalfactura
        OrdenServicio.calculo_total(@orden_servicio.id)


        @etapa = Etapa.new
        @etapa.descripcion = "Preparada para el envio"
        @etapa.fecha = Time.now.utc
        @etapa.lugar = "GGN Express, Oficina Principal, Los Palos Grandes"
        @etapa.orden_servicio_id = @orden_servicio.id
        @etapa.save


        respond_to do |format|
          format.xml
        end
      else
        respond_to do |format|
          format.xml {render "xml_errores_datos"}
        end
      end
    else
      respond_to do |format|
        format.xml {render "xml_errores_vacio"}
      end
    end
  end

  
  
  # Este metodo se encarga de devolver la información referente a una orden de servicio
  # Devuelve un xml con el numero de tracking(numero de orden) , la fecha de la orden, el estatus de la orden,
  # La direccioón de recoleccción, los movimientos asociados a esa orden y la direccion de envío
  def tracking
  	
    @orden_servicio = OrdenServicio.find(params[:id])
    @tracking = @orden_servicio.id
    @fecha = @orden_servicio.fecha_orden
    @estatus = @orden_servicio.estatus
    @etapas = Etapa.all( :conditions =>  {:orden_servicio_id => @orden_servicio.id})
    @etapas.each do |etapa|
      @lugar = etapa.lugar
      @descripcion= etapa.descripcion
      @fecha = etapa.fecha
    end
    @direccion = Direccion.first( :conditions =>  {:id => @orden_servicio.direccion_id})
    #    @direrecoleccion = @direccion.residencia_calle+" "+ @direccion.apartamento_num_casa+" "  + @direccion.urbanizacion+" " + @direccion.ciudad+" "+ @direccion.pais
    #    @direnvio = @orden_servicio.residencia_calle+" "+ @orden_servicio.apartamento_num_casa+" "  + @orden_servicio.urbanizacion + " " + @orden_servicio.ciudad+" "+@orden_servicio.pais
					
				
    respond_to do |format|
      format.xml
    end  	 
  end
  
 
  
  def crear_xml
    @orden_servicio = OrdenServicio.find(:first, :conditions => ["estatus = ?", "Recolectada"])
    puts @orden_servicio.id
    #@cliente = Cliente.find(@orden_servicio.id)
    #    @direccion = Direccion.all(:conditions => {:cliente_id => session[:cliente_id]} )
    #    @direccion1 = OrdenServicio.direcciones(@orden.id,'Recolectada')
    #    @direccion2 = Orden.direcciones(@orden.id,'Entregada')
    @paquete = Paquete.find(:first, :conditions => ["orden_servicio_id = ?", @orden_servicio.id ])
    #@factura = Factura.where(:ordens_id => @orden.id).first
    #@tarjeta = Tarjeta.find(@orden_servicio.tarjeta_id)
    @xmlenvio = '<solicitud>
                  <cliente>
                      <tarjeta>501878032500676571</tarjeta>
                      <nombre_direccion>Mi Casa</nombre_direccion>
                      <correo>gianfranco.guglielmin@gmail.com</correo>
                  </cliente>
                  <orden>
                    <nombre_receptor>' + @orden_servicio.nombre_receptor + '</nombre_receptor>
                    <apellido_receptor>' + @orden_servicio.apellido_receptor + '</apellido_receptor>
                    <residencia_calle>' + @orden_servicio.residencia_calle + '</residencia_calle>
                    <apartamento_num_casa>' + @orden_servicio.apartamento_num_casa + '</apartamento_num_casa>
                    <urbanizacion>' + @orden_servicio.urbanizacion + '</urbanizacion>
                    <ciudad>' + @orden_servicio.ciudad + '</ciudad>
                    <pais>' + @orden_servicio.pais + '</pais>
                  </orden>
                  <paquete>
                      <peso>' + @paquete.peso.to_s + '</peso>
                      <descripcion>' + @paquete.descripcion + '</descripcion>
                 </paquete>
               </solicitud>'


    uri = URI.parse("http://192.168.20.128:3000/rest_servicio/apoyo")
    http = Net::HTTP.new(uri.host, uri.port)
    headers = { 'Content-Type'=>'application/xml', 'Content-Length' => @xmlenvio.size.to_s }
    post = Net::HTTP::Post.new(uri.path, headers)
    response = http.request post, @xmlenvio

    xmlresponse = Hash.from_xml(response.body)
    case response
    when Net::HTTPCreated
      if xmlresponse["Error"]["error"]
        return xmlresponse["Error"]["error"]
      else
        @orden_servicio.remoto = xmlresponse["respuesta"]["tracking"]
        @costo = xmlresponse["respuesta"]["monto"]
        @orden_servicio.save
        return 'Se guardo con exito'
      end
    when Net::HTTPSuccess
      if xmlresponse["Error"]["error"]
        return xmlresponse["Error"]["error"]
      else
        @orden_servicio.remoto = xmlresponse["respuesta"]["tracking"]
        @costo = xmlresponse["respuesta"]["monto"]
        @orden_servicio.save
        return 'Se guardo con exito'
      end

    else response.error!
      return 'Error'
    end
  end




  require 'savon'

#
#client = Savon::Client.new do
#  wsdl.document = "http://192.168.23.192/WS/serviciowsdl.php?wsdl"
##  wsdl.document = "http://www.webservicex.net/periodictable.asmx?WSDL"
#end

#puts client.wsdl.soap_actions
#respuesta = client.request :wsdl,
#response = client.request :wsdl, "calcularcosto" do
# soap.body = {
#   :correo => "alfredohaddad@gmail.com",
#   :ciudadorigen => "Caracas",
#   :ciudadestino => "Los Teques",
#   :urbanizaciondestino => "Los Mangos",
#   :calledestino => "ciega",
#   :numerocasadestino => "3",
#   :latituddestino => "10.134323897",
#   :longituddestino => "-66.132438765",
#   :pago => "123",
#   :descripcion => "no se",
#   :peso => "12.3"
#    }
#end

#  response = client.request :wsdl, "rastreoPaquete" do
# soap.body = {
#   :idtracking => "234567"
#    }
#end

#def soap
#  client = Savon::Client.new "http://www.kirupafx.com/WebService/TopMovies.asmx?WSDL"
#    response = client.GetCitiesByCountry do |soap|
#      soap.body = { "wsdl:CountryName" => "France" }
#    end
#    cadenaxml = response.to_s
#    xml_doc = Nokogiri::XML(cadenaxml)
#end

#def soap
#wsdl = "http://soaptest.parasoft.com/calculator.wsdl"
#client = Savon::Client.new wsdl
#client.add do |soap|
#  soap.input = [
#    "GetTop10Response",
#    { "xmlns" => "http://www.parasoft.com/wsdl/calculator/" }
#  ]
#  soap.body = {:x => "1", :y => "2"}
#end
#
#end
  def soap
    client = Savon::Client.new do
      wsdl.document = "http://www.webservicex.com/CurrencyConvertor.asmx?wsdl"
    end
    client.wsse["wsse:Security"]["wsse:UsernameToken"] = { "Organization" => "ACME" }
    response = client.request :web, :conversion_rate do
      soap.body = {
        :FromCurrency => 'USD',
        :ToCurrency => 'EUR'
      }
    end
    puts response.to_hash;
    render :text => response.to_xml
  end


#def soap
#client = Savon::Client.new do
#  wsdl.document = "http://www.webservicex.com/globalweather.asmx?WSDL"
#end
#
#puts client.wsdl.soap_actions
#
#response = client.request :wsdl, "GetCitiesByCountry" do
# soap.body = {
#   :ElementName => "France"
#    }
#end
#end



end
